package util;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import entity.Student;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 4938229950926725617L;

    private Map<String, Object> extraMap;

    // @JsonAnyGetter 可在传出数据时 将额外参数写入对象中
    @JsonAnyGetter
    public Map getExtraMap() {
        return this.extraMap;
    }

    // 使用 BeanUtils.copyProperties 方法 要有set方法，否则无法实现
    public void setExtraMap(Map<String, Object> extraMap){
        this.extraMap = extraMap;
    }

    // @JsonAnySetter 数据传入时，如果对象有多余参数加这个注解会把多余参数注入进 map 中
    @JsonAnySetter
    public void setExtraMapProperties(String key, Object value) {
        if (Objects.isNull(key) || Objects.isNull(value)) {
            return;
        }
        if (Objects.isNull(extraMap)) {
//            extraMap=new HashMap(8,0.5F);
            this.extraMap = new HashMap();
        }
        this.extraMap.put(key, value);
    }

    /**
     * 设置进getExtraMap 按键获取值，没有值使用默认值
     * @JsonIgnore 序列化时忽略这个方法
     * @param name         键（属性名）
     * @param defaultValue 默认值
     * @return T
     * Copyright (c) 2020 MANJDD
     * @author kmchen
     * @date 16:39 2020/10/15
     **/
    @JsonIgnore
    public <T> T getExtraProperty(String name, T defaultValue) {
        T value = this.getExtraProperty(name);
        return value == null ? defaultValue : value;
    }

    /**
     * @JsonIgnore序列化时忽略这个方法
     */
    @JsonIgnore
    public <T> T getExtraProperty(String name) {
        return (name == null || extraMap == null) ? null : (T) extraMap.get(name);
    }

}
